using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using MakeIT.Framework.Util;
using MakeIT.SGI.ERP.Entidades;
using MakeIT.SGI.ERP.Negocios;

namespace MakeIT.SGI.ERP.Apresentacao
{
	public partial class CadastroColaborador : System.Web.UI.Page
	{

		UsuarioVO usuarioVO = null;
		protected SgiDAOT SgiDAOT = null;

		protected void Page_Load(object sender, EventArgs e)
		{
			this.SgiDAOT = new SgiDAOT();
			usuarioVO = (UsuarioVO)this.Session["userActive"];

			if (!IsPostBack)
			{
				Util.HabilitarCampos(false, this.panelCad);
				atualizarDdlIdCargo(null, null);
				atualizarDdlIdDepto(null, null);
				

                carregaFilial();

                atualizarDdlIdPessoa(null, null);
                atualizarDdlIdPessoaG(null, null);
			}

		}

		protected void Page_Unload(object sender, EventArgs e)
		{
			try
			{
				if (this.SgiDAOT != null)
					this.SgiDAOT.closeDAO();
			}
			catch (Exception ex) {}
		}

		protected void grvResultado_PageIndexChanging(object sender, GridViewPageEventArgs e)
		{
			this.grvResultado.PageIndex = e.NewPageIndex;
			btnPesquisa_Click(null, null);
		}
		protected void atualizarDdlIdCargo(object sender, ImageClickEventArgs e)
		{
			List<CargoVO> idCargoCadVOs = new List<CargoVO>();
			CargoVO idCargoCadVO = CargoVO.CreateVO();
			idCargoCadVO.idCargo = -1;
			idCargoCadVO.cargo = "";
			idCargoCadVOs.Add(idCargoCadVO);
			idCargoCadVOs.AddRange(this.SgiDAOT.getCargos());
			this.ddlCadIdCargo.DataSource = idCargoCadVOs;
			this.ddlCadIdCargo.DataBind();

			CargoVO idCargoVO = CargoVO.CreateVO();
			idCargoVO.idCargo = -1;
			idCargoVO.cargo = "";
			List<CargoVO> idCargoVOs = new List<CargoVO>();
			idCargoVOs.Add(idCargoVO);
			idCargoVOs.AddRange(this.SgiDAOT.getCargos());
			this.ddlIdCargo.DataSource = idCargoVOs;
			this.ddlIdCargo.DataBind();

		}

		protected void atualizarDdlIdDepto(object sender, ImageClickEventArgs e)
		{
			List<DeptoVO> idDeptoCadVOs = new List<DeptoVO>();
			DeptoVO idDeptoCadVO = DeptoVO.CreateVO();
			idDeptoCadVO.idDepto = -1;
			idDeptoCadVO.depto = "";
			idDeptoCadVOs.Add(idDeptoCadVO);
			idDeptoCadVOs.AddRange(this.SgiDAOT.getDeptos());
			this.ddlCadIdDepto.DataSource = idDeptoCadVOs;
			this.ddlCadIdDepto.DataBind();

			DeptoVO idDeptoVO = DeptoVO.CreateVO();
			idDeptoVO.idDepto = -1;
			idDeptoVO.depto = "";
			List<DeptoVO> idDeptoVOs = new List<DeptoVO>();
			idDeptoVOs.Add(idDeptoVO);
			idDeptoVOs.AddRange(this.SgiDAOT.getDeptos());
			this.ddlIdDepto.DataSource = idDeptoVOs;
			this.ddlIdDepto.DataBind();

		}

		protected void atualizarDdlIdPessoa(object sender, ImageClickEventArgs e)
		{
            CarregaDDL.carregaPessoa(this.SgiDAOT, ddlIdPessoa, Convert.ToInt32(ddlIdFilial.SelectedValue));
            CarregaDDL.carregaPessoa(this.SgiDAOT, ddlCadIdPessoa, txtCadPesquisarPessoa.Text, Convert.ToInt32(ddlCadFilialPessoa.SelectedValue));
		}

		protected void atualizarDdlIdPessoaG(object sender, ImageClickEventArgs e)
		{
            CarregaDDL.carregaPessoa(this.SgiDAOT, ddlIdPessoaG, Convert.ToInt32(ddlIdFilial.SelectedValue));
            CarregaDDL.carregaPessoa(this.SgiDAOT, ddlCadIdPessoaG, txtCadPesquisarGestor.Text, Convert.ToInt32(ddlCadFilialGestor.SelectedValue));
		}

        protected void carregaFilial()
        {
            CarregaDDL.carregaFilial(this.SgiDAOT, ddlCadFilialPessoa);

            CarregaDDL.carregaFilial(this.SgiDAOT, ddlCadFilialGestor);

            CarregaDDL.carregaFilial(this.SgiDAOT, ddlIdFilial);
        }

		/// <summary>
		/// Manipula o evento do botão btnSalvar
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnSalvar_Click(object sender, EventArgs e)
		{
            List<ColaboradorVO> cVOsTemp = null;

			//Declara objetos
			ColaboradorVO colaboradorVO = null;
			bool novoRegistro = false;

			try
			{
				//Verifica se o ID é nulo, se sim = cadastro novo
				if (string.IsNullOrEmpty(this.txtCadIdColaborador.Text))
				{
                    cVOsTemp = this.SgiDAOT.getColaboradors(null, null, null, Convert.ToInt32(ddlCadIdPessoa.SelectedValue), null, Convert.ToInt32(ddlCadFilialPessoa.SelectedValue), true);

                    if (cVOsTemp.Count > 0)
                    {
                        Util.ExibeAlert(this, "Pessoa já vinculada a um colaborador!");
                        return;
                    }


					colaboradorVO = ColaboradorVO.CreateVO();
					colaboradorVO.cadastro = DateTime.Now;
					colaboradorVO.cadastradoPor = usuarioVO.user;

					novoRegistro = true;

				}
				//Recupera dados para serem alterados
				else
				{
					//Recupera dados
					colaboradorVO = this.SgiDAOT.getColaborador(Int32.Parse(this.txtCadIdColaborador.Text));


                    cVOsTemp = this.SgiDAOT.getColaboradors(null, null, null, Convert.ToInt32(ddlCadIdPessoa.SelectedValue), null, Convert.ToInt32(ddlCadFilialPessoa.SelectedValue), true);

                    foreach (ColaboradorVO cVOItem in cVOsTemp)
                    {
                        if ((cVOsTemp.Count > 1 || !colaboradorVO.idColaborador.Equals(cVOItem.idColaborador)) && ddlCadAtivo.SelectedValue == "S")
                        {
                            Util.ExibeAlert(this, "Pessoa já vinculada a um colaborador!");
                            return;
                        }
                    }
                    
				}

				if(this.ddlCadIdCargo.SelectedValue.Equals("-1"))
					colaboradorVO.idCargo = null;
				else
					colaboradorVO.idCargo = Int32.Parse(this.ddlCadIdCargo.SelectedValue);
				if(this.ddlCadIdDepto.SelectedValue.Equals("-1"))
					colaboradorVO.idDepto = null;
				else
					colaboradorVO.idDepto = Int32.Parse(this.ddlCadIdDepto.SelectedValue);
				colaboradorVO.idPessoa = Int32.Parse(this.ddlCadIdPessoa.SelectedValue);
				colaboradorVO.idPessoaG = Int32.Parse(this.ddlCadIdPessoaG.SelectedValue);
                colaboradorVO.ativo = this.ddlCadAtivo.SelectedValue.Equals("S");
				colaboradorVO.edicao = DateTime.Now;
				colaboradorVO.editadoPor = usuarioVO.user;

				//Chama metodo para salvar ou criar novo registro
				if (novoRegistro)
					colaboradorVO.idColaborador = (int)this.SgiDAOT.newColaborador(colaboradorVO);
				else
					this.SgiDAOT.setColaborador(colaboradorVO);

				// Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro salvo com sucesso!");

				//Popula grid atualizado
				this.btnPesquisa_Click(null, null);

				//Atualiza formulario, apos salvar os dados
				this.txtCadIdColaborador.Text = colaboradorVO.idColaborador.ToString();
				this.ltCadastradoPor.Text = colaboradorVO.cadastradoPor;
				this.ltEditadoPor.Text = colaboradorVO.editadoPor;
				this.ltDataCadastro.Text = colaboradorVO.cadastro.ToString("dd/MM/yyyy");
				this.ltDataEdicao.Text = colaboradorVO.edicao.ToString("dd/MM/yyyy");

			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		/// <summary>
		/// Manipula o evento do botão btnPesquisa
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnPesquisa_Click(object sender, EventArgs e)
		{

			//Declara objetos
			int? idCargo = null;
			int? idDepto = null;
			int? idColaborador = null;
			int? idPessoa = null;
			int? idPessoaG = null;
            int? idFilial = null;
            bool? ativo = null;


			try
			{

				if(!this.ddlIdCargo.SelectedValue.Equals("-1"))
				{
					idCargo = Int32.Parse(this.ddlIdCargo.SelectedValue);
				}

				if(!this.ddlIdDepto.SelectedValue.Equals("-1"))
				{
					idDepto = Int32.Parse(this.ddlIdDepto.SelectedValue);
				}

				if (!string.IsNullOrEmpty(this.txtIdColaborador.Text))
				{
					idColaborador = Int32.Parse(this.txtIdColaborador.Text);
				}

				if(!this.ddlIdPessoa.SelectedValue.Equals("-1"))
				{
					idPessoa = Int32.Parse(this.ddlIdPessoa.SelectedValue);
				}

				if(!this.ddlIdPessoaG.SelectedValue.Equals("-1"))
				{
					idPessoaG = Int32.Parse(this.ddlIdPessoaG.SelectedValue);
				}
                if (!this.ddlIdFilial.SelectedValue.Equals("-1"))
                {
                    idFilial = Int32.Parse(this.ddlIdFilial.SelectedValue);
                }

                if (!this.ddlAtivo.SelectedValue.Equals(" "))
                {
                    ativo = this.ddlAtivo.SelectedValue.Equals("S");
                }

				//Recupera a lista de registros segundo a pesquisa
				this.grvResultado.DataSource = this.SgiDAOT.getColaboradors(idColaborador, idCargo, idDepto, idPessoa, idPessoaG, idFilial, ativo);

				//Vincula os dados
				this.grvResultado.DataBind();
			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		/// <summary>
		/// Manipula o evento do botão btnCancelar
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnCancelar_Click(object sender, EventArgs e)
		{
			//Volta para a tab page de pesquisa
			//this.tabColaborador.ActiveTabIndex = 0;

			// Desabilita os campos para edição
			Util.HabilitarCampos(false, this.panelCad);

            this.btnPesquisarPessoa.Enabled = false;
            this.btnPesquisarGestor.Enabled = false;

			// Destrava botão de edição
			this.btnEditar.Enabled = (!string.IsNullOrEmpty(this.txtCadIdColaborador.Text));

			// Destrava botão de exclusao
			this.btnExcluir.Enabled = (!string.IsNullOrEmpty(this.txtCadIdColaborador.Text));

			// Detrava botão de novo
			this.btnNovo.Enabled = true;

			// Desabilita o botão salvar
			this.btnSalvar.Enabled = false;

		}

		protected void imgbVisualizar_Click(object sender, ImageClickEventArgs e)
		{
            limpaPessoaGestor();

			// Declara objetos
			ColaboradorVO colaboradorVO = null;
			int idColaborador = 0;

			try
			{
				//Recupera os argumentos com o ID do objeto
				string[] argumentos = ((ImageButton)sender).CommandArgument.Split(';');
				idColaborador = Int32.Parse(argumentos[0]);

				//Recupera o objeto
				colaboradorVO = this.SgiDAOT.getColaborador(idColaborador);

				if(colaboradorVO.idCargo==null)
					this.ddlCadIdCargo.SelectedValue = "-1";
				else
					this.ddlCadIdCargo.SelectedValue = colaboradorVO.idCargo.Value.ToString();
				if(colaboradorVO.idDepto==null)
					this.ddlCadIdDepto.SelectedValue = "-1";
				else
					this.ddlCadIdDepto.SelectedValue = colaboradorVO.idDepto.Value.ToString();
				this.txtCadIdColaborador.Text = colaboradorVO.idColaborador.ToString();

                PessoaVO pVOp = SgiDAOT.getPessoa(colaboradorVO.idPessoa);
                this.ddlCadFilialPessoa.SelectedValue = pVOp.idFilial.ToString();
                this.txtCadPesquisarPessoa.Text = pVOp.pessoa;
                atualizarDdlIdPessoa(null, null);
                this.ddlCadIdPessoa.SelectedValue = colaboradorVO.idPessoa.ToString();


                PessoaVO pVOg = SgiDAOT.getPessoa(colaboradorVO.idPessoaG);
                if (pVOg != null)
                {
                    this.ddlCadFilialGestor.SelectedValue = pVOg.idFilial.ToString();
                    this.txtCadPesquisarGestor.Text = pVOg.pessoa;
                    atualizarDdlIdPessoaG(null, null);
                    this.ddlCadIdPessoaG.SelectedValue = colaboradorVO.idPessoaG.ToString();
                    this.ddlCadAtivo.SelectedValue = (colaboradorVO.ativo == null ? " " : (colaboradorVO.ativo.Value ? "S" : "N"));
                }

				this.ltCadastradoPor.Text = colaboradorVO.cadastradoPor;
				this.ltEditadoPor.Text = colaboradorVO.editadoPor;
				this.ltDataCadastro.Text = colaboradorVO.cadastro.ToString("dd/MM/yyyy");
				this.ltDataEdicao.Text = colaboradorVO.edicao.ToString("dd/MM/yyyy");



				//Habilita tab page do cadastro
				this.tabColaborador.ActiveTabIndex = 1;

				//Desabilita campos para edição
				Util.HabilitarCampos(false, this.panelCad);

                this.btnPesquisarPessoa.Enabled = false;
                this.btnPesquisarGestor.Enabled = false;

				//Desabilita botão salvar
				this.btnSalvar.Enabled = false;

				//Habilita botão editar
				this.btnEditar.Enabled = true;

				//Habilita botão excluir
				this.btnExcluir.Enabled = true;

				//Habilita botão novo
				this.btnNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		// <summary>
		// Manipula o evento editar do web form
		// </summary>
		// <param name="sender">Objeto disparador de evento</param>
		// <param name="e">Argumento do evento</param>
		protected void btnEditar_Click(object sender, EventArgs e)
		{
			// Habilita os campos para edição
			Util.HabilitarCampos(true, this.panelCad);

            this.btnPesquisarPessoa.Enabled = true;
            this.btnPesquisarGestor.Enabled = true;

			// Trava apenas os text box da PK
			this.txtCadIdColaborador.Enabled = false;

			// Trava botão de edição
			this.btnEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnExcluir.Enabled = false;

			// Trava botão de novo
			this.btnNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnSalvar.Enabled = true;

		}

		protected void btnNovo_Click(object sender, EventArgs e)
		{
            limpaPessoaGestor();

			//Limpa formulario, para a entrada de novo registro
			Util.LimparCampos(this.panelCad);
			// Habilita os campos para edição
			Util.HabilitarCampos(true, this.panelCad);

			this.ltCadastradoPor.Text = "";
			this.ltEditadoPor.Text = "";
			this.ltDataCadastro.Text = "";
			this.ltDataEdicao.Text = "";

            this.btnPesquisarPessoa.Enabled = true;
            this.btnPesquisarGestor.Enabled = true;

			// Trava apenas os text box da PK
			this.txtCadIdColaborador.Enabled = false;

			// Trava botão de edição
			this.btnEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnExcluir.Enabled = false;

			// Trava botão de novo
			this.btnNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnSalvar.Enabled = true;

		}

		protected void btnExcluir_Click(object sender, EventArgs e)
		{
			//Declara objetos
			ColaboradorVO colaboradorVO = null;

			try
			{
				//Cria objeto
				colaboradorVO = ColaboradorVO.CreateVO();
				colaboradorVO.idColaborador = Int32.Parse(this.txtCadIdColaborador.Text);

				//verifica se tem caixaturno dependentes deste registro
				if (this.SgiDAOT.getCountCaixaturnoxIdColaborador(colaboradorVO.idColaborador) > 0)
				{
					Util.ExibeAlert(this, "Há Turno de Caixa(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem caixaturno dependentes deste registro
				if (this.SgiDAOT.getCountCaixaturnoxIdColaboradorSA(colaboradorVO.idColaborador) > 0)
				{
					Util.ExibeAlert(this, "Há Turno de Caixa(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem caixaturno dependentes deste registro
				if (this.SgiDAOT.getCountCaixaturnoxIdColaboradorSF(colaboradorVO.idColaborador) > 0)
				{
					Util.ExibeAlert(this, "Há Turno de Caixa(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//verifica se tem colaborador dependentes deste registro
				if (this.SgiDAOT.getCountColaboradorxIdPessoaG(colaboradorVO.idColaborador) > 0)
				{
					Util.ExibeAlert(this, "Há Colaborador(s) associado(s) a este registro. Exclusão não permitida");
					return;
				}

				//Chama metodo para excluir registro
				this.SgiDAOT.delColaborador(colaboradorVO);

				// Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro excluido com sucesso!");

				//Popula grid atualizado
				this.btnPesquisa_Click(null, null);

				//Limpa formulario, apos salvar os dados
				Util.LimparCampos(this.panelCad);
				this.ltCadastradoPor.Text = "";
				this.ltEditadoPor.Text = "";
				this.ltDataCadastro.Text = "";
				this.ltDataEdicao.Text = "";

                this.btnPesquisarPessoa.Enabled = false;
                this.btnPesquisarGestor.Enabled = false;

				// Trava botão de edição
				this.btnEditar.Enabled = false;

				// Trava botão de exclusao
				this.btnExcluir.Enabled = false;

				// Desabilita o botão salvar
				this.btnSalvar.Enabled = false;

				// Habilita o botao novo
				this.btnNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
			
		}

        protected void ddlIdFilial_SelectedIndexChanged(object sender, EventArgs e)
        {
            atualizarDdlIdPessoaG(null, null);
            atualizarDdlIdPessoa(null, null);
        }

        #region pesquisa pessoa

        protected void btnPesquisarPessoa_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(txtCadPesquisarPessoa.Text) && !ddlCadFilialPessoa.SelectedValue.Equals("-1"))
                atualizarDdlIdPessoa(null, null);
            else
                Util.ExibeAlert(this, "Informe a pessoa e a filial para a pesquisa!");
        }

        protected void ddlCadFilialPessoa_SelectedIndexChanged(object sender, EventArgs e)
        {
            atualizarDdlIdPessoa(null, null);
        }

        #endregion

        #region pesquisa gestor

        protected void btnPesquisarGestor_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(txtCadPesquisarGestor.Text) && !ddlCadFilialGestor.SelectedValue.Equals("-1"))
            {
                PessoaVO pVO = PessoaVO.CreateVO();
                pVO.idPessoa = -1;
                pVO.pessoa =  "";

                List<PessoaVO> pVOLista = new List<PessoaVO>();
                pVOLista.Add(pVO);

                foreach(PessoaVO pVOItem in this.SgiDAOT.getPessoas(null, txtCadPesquisarGestor.Text, Convert.ToInt32(ddlCadFilialGestor.SelectedValue), null, null))
                {
                    ColaboradorVO cVO = this.SgiDAOT.getColaborador(null, null, null, pVOItem.idPessoa);
                    
                    if(cVO != null)
                        pVOLista.Add(pVOItem); 
                }

                ddlCadIdPessoaG.DataTextField = "pessoa";
                ddlCadIdPessoaG.DataValueField = "PKString";

                ddlCadIdPessoaG.Items.Clear();
                ddlCadIdPessoaG.DataSource = pVOLista;
                ddlCadIdPessoaG.DataBind();
            }
            else
                Util.ExibeAlert(this, "Informe o gestor e a filial Administrativo para a pesquisa!");
        }

        protected void ddlCadFilialGestor_SelectedIndexChanged(object sender, EventArgs e)
        {
            atualizarDdlIdPessoaG(null, null);
        }

        #endregion

        public void limpaPessoaGestor()
        {
            this.txtCadPesquisarPessoa.Text = String.Empty;
            this.ddlCadFilialPessoa.SelectedIndex = 0;
            atualizarDdlIdPessoa(null, null);

            this.txtCadPesquisarGestor.Text = String.Empty;
            this.ddlCadFilialGestor.SelectedIndex = 0;
            atualizarDdlIdPessoaG(null, null);
        }
    }
}
